package com.itheima.sh.controller;

import com.itheima.sh.pojo.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * 问题1： 请求地址硬编码，导致地址无法动态变更  --> IP和PORT
 * 问题2： 无法提供负载均衡能力 高可用   --> IP和PORT
 * 问题3： 无法动态的感知服务状态
 *
 *
 * 技术解决上述问题：
 *   注册中心：就是管理服务的 IP和PORT和服务健康状态的
 */
@RestController
@RequestMapping("consumer")
public class ConsumerController {

    @Autowired
    RestTemplate restTemplate;

    @Autowired
    DiscoveryClient discoveryClient;


    @GetMapping("{id}")
    @HystrixCommand(fallbackMethod = "findUserFallBack")
    public User findUser(@PathVariable("id") String username) {

        // 1 发送请求
//        String url = "http://localhost:8081/user/"+username;


        //解决方案1：discoveryClient
//        List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
//        ServiceInstance instance = instances.get(0);  // 服务实例对象 管理是 IP和端口
//        String host = instance.getHost();// IP
//        int port = instance.getPort();// PORT
//        String url = "http://"+host+":"+port+"/user/"+username;

//        String uri = instance.getUri().toString();
//        String url = "http://localhost:8081/user/"+username;

        // 解决方案2： 基于Ribbon解决客户端负载均衡， 默认的负载均衡算法 轮询
        String url = "http://user-service/user/"+username;
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }

    /**
     * 备选方案：符合预期、可处理的返回值
     * 服务降级
     * @param username
     * @return
     */
    public User findUserFallBack( String username) {
        User user = new User();
        user.setEmail("-1");
        user.setUsername(username);
        user.setName("暂停服务");
        return user;
    }





}
